package com.yn.courseselectionsystem.server;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: TODO
 * @author: Tokyo_God
 * @date: 2021/1/12 9:52
 * Role of:
 * @version: v1.0
 */
//只有用户进了这个地址才是连接，连接之后他会执行   @OnOpen
@ServerEndpoint(value = "/studentManagement/succPage/socketServer/{userId}")
@Component //注册成bean
public class SocketServer {
    private Session session;
    //userid  session
    private static Map<String,Session> sessionPool=new HashMap<String, Session>();
    //session.getId   userId
    private static Map<String,String>sessionIds=new HashMap<String, String>();

    /**
     * 用户连接时触发
     * @param session
     * @param userId
     */
    @OnOpen
    public void open(Session session, @PathParam(value = "userId")String userId){
        System.out.println("已连接websocket;userId="+userId);
        this.session=session;
        sessionPool.put(userId,session);
        sessionIds.put(session.getId(),userId);
    }
/////////////////怎么获取发件人///////////////////
    ///////////////////没进/////////////////
    /**
     * 收到消息时触发
     * @param message
     */
    @OnMessage
    public void onMessage(String message){
        System.out.println("发送人的userId为："+sessionIds.get(session.getId())
                +"发送内容为"+message);
    }
/////////////////怎么获取发件人///////////////////
    ///////////////////没进/////////////////
    /**
     * 连接关闭触发
     */
    @OnClose
    public void onClose(Session session){
        System.out.println("用户"+sessionIds.get(session.getId())+"关闭连接");
        sessionPool.remove(sessionIds.get(session.getId()));
        sessionIds.remove(session.getId());
    }

    /**
     * 发生错误时触发
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session,Throwable error){
        System.out.println("用户"+sessionIds.get(session.getId())+"发生错误");
        error.printStackTrace();
    }

    /**
     * 信息发送方法
     * @param message
     * @param userId
     */
    public void sendMessage(String message,String userId){
        Session s=sessionPool.get(userId);//获取指定的会话,只有用户连接开启了才会有
        System.out.println("发送信息msg:"+message);
        if(s!=null){
            try {
                s.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            System.out.println("该用户"+userId+"未连接");
        }
    }

    /**
     * 获取当前连接数
     * @return
     */
    public int getOnlineNum(){
        return sessionPool.size();
    }

    /**
     * 获取在线的用户名数组
     * @return
     */
    public String[] getOnlineUsers(){
        String[]strs={};
        int i=0;
        for(String key:sessionIds.keySet()){
            strs[i]=(sessionIds.get(key));
            i++;
        }
        return strs;
    }


    /**
     * 发给在线所以用户名信息
     * @param msg
     */
    public void sendAll(String msg){
        for (String key:sessionPool.keySet()){
            sendMessage(msg,key);
        }
    }

    /**
     * 多个人发送给指定的几个用户
     * @param msg
     * @param persons  用户s
     */
    public void SendMany(String msg,String [] persons) {
        for (String userid : persons) {
            sendMessage(msg, userid);
        }
    }
}
